home *** CD-ROM | disk | FTP | other *** search
/ Revista do CD-ROM 124 / cd-rom 124.iso / edu / tuxmath / tuxmathscrabble / asymptopia / AnimatedChar.py < prev    next >
Encoding:
Python Source  |  2003-07-26  |  4.9 KB  |  179 lines

  1. #!/usr/bin/python
  2. """
  3. /***************************************************************************
  4.  
  5.     Author             :Charles B. Cosse 
  6.     
  7.     Email            :ccosse@asymptopia.com
  8.                     
  9.     Copyright        :(C) 2002,2003 Asymptopia Software.
  10.     
  11.  ***************************************************************************/
  12. /***************************************************************************
  13.                          AnimatedChar.py
  14.  
  15.  ***************************************************************************/
  16.  
  17. /***************************************************************************
  18.  *                                                                         *
  19.  *   This program is free software; you can redistribute it and/or modify  *
  20.  *   it under the terms of the GNU General Public License as published by  *
  21.  *   the Free Software Foundation; either version 2 of the License, or     *
  22.  *   (at your option) any later version. (Please note that if you use this *
  23.  *   code you must give credit by including the Author and Copyright       *
  24.  *   info at the top of this file).                                        *
  25.  ***************************************************************************/
  26.  
  27. """
  28.  
  29. import os, pygame,sys
  30. from pygame.locals import *
  31. from random import random
  32. import time
  33.  
  34. class AnimatedChar(pygame.sprite.Sprite):
  35.     def __init__(self,seqpyld,xc0,yc0):
  36.         pygame.sprite.Sprite.__init__(self)
  37.  
  38.         self.seqpyld=seqpyld
  39.         self.seqname=None
  40.         self.frame=None
  41.         self.image=seqpyld[seqpyld.keys()[0]][0]['img']
  42.         self.rect=self.image.get_rect()
  43.         self.rect.center=(xc0,yc0)
  44.         self.dx=None
  45.         self.dy=None
  46.         self.timeout=None
  47.         
  48.         self.dest=None    
  49.         self.xc=xc0
  50.         self.yc=yc0
  51.         
  52.         self.idx=0
  53.         self.stationary_idx=0
  54.         
  55.         self.maneuver_stack=[]
  56.             
  57.     def update(self):
  58.     
  59.         if not self.dest:return
  60.         if not self.rect:return
  61.         
  62.         if self.dest[0]!=(-999 or None):
  63.             if self.idx<len(self.seqpyld[self.seqname])-1:
  64.                 self.frame=self.seqpyld[self.seqname][self.idx]
  65.                 self.image=self.frame['img']
  66.                 self.idx=self.idx+1
  67.             else:
  68.                 self.frame=self.seqpyld[self.seqname][self.idx]
  69.                 self.image=self.frame['img']
  70.                 self.idx=0
  71.             
  72.             self.xc=self.xc+self.frame['dx']
  73.             self.yc=self.yc+self.frame['dy']
  74.             self.rect=self.image.get_rect()    
  75.             self.rect.center=(self.xc,self.yc)
  76.             
  77.             #get within some r_min, then sync centers:
  78.             #if self.rect.collidepoint(self.dest):
  79.             r2=2*pow(self.frame['dx'],2)+2*pow(self.frame['dy'],2)
  80.             dist=pow((self.dest[0]-self.rect.center[0]),2)+pow((self.dest[1]-self.rect.center[1]),2)
  81.             if dist<=r2:
  82.                 self.xc=self.dest[0]#xc,yc are what is persistent between sequences -- not "self.rect"!
  83.                 self.yc=self.dest[1]
  84.                 self.unset_dest()
  85.                 self.idx=0
  86.                 if len(self.maneuver_stack)>0:
  87.                     self.set_dest(self.maneuver_stack.pop())
  88.                     
  89.             return(`self.rect.center`)
  90.         
  91.         elif self.dest[0]==-999:
  92.             if self.stationary_idx<=self.dest[1]:
  93.                 try:
  94.                     self.frame=self.seqpyld[self.seqname][self.idx]
  95.                 except Exception,e:
  96.                     print `e`,self.seqname,self.idx,self.stationary_idx,self.dest
  97.                 self.image=self.frame['img']
  98.                 
  99.                 self.xc=self.xc+self.frame['dx']
  100.                 self.yc=self.yc+self.frame['dy']
  101.                 self.rect=self.image.get_rect()    
  102.                 self.rect.center=(self.xc,self.yc)
  103.                 
  104.                 self.idx=self.idx+1
  105.                 if self.idx>=len(self.seqpyld[self.seqname]):
  106.                     self.idx=0
  107.                     self.stationary_idx=self.stationary_idx+1
  108.             else:
  109.                 self.unset_dest()
  110.                 self.idx=0
  111.                 self.stationary_idx=0
  112.                 if len(self.maneuver_stack)>0:
  113.                     self.set_dest(self.maneuver_stack.pop())
  114.                     self.stationary_idx=self.stationary_idx+1
  115.             
  116.             
  117.             return(`self.rect.center`)
  118.  
  119.  
  120.     def set_seqname(self,seqname):
  121.         self.seqname=seqname
  122.         self.frame=self.seqpyld[seqname][0]
  123.         self.image=self.frame['img']
  124.         self.rect=self.image.get_rect()
  125.         self.rect.center=(self.xc,self.yc)
  126.         self.dx=self.frame['dx']
  127.         self.dy=self.frame['dy']
  128.         self.timeout=self.frame['timeout']
  129.         self.stationary_idx=0
  130.         
  131.     def unset_seqname(self):
  132.         #print 'unset_seqname'
  133.         self.seqname=None
  134.         self.frame=None
  135.         #self.image=None
  136.         self.dx=None
  137.         self.dy=None
  138.         self.timeout=None
  139.     
  140.     def set_dest(self,dest):
  141.         #print 'set_dest:',dest,self.maneuver_stack
  142.         self.set_seqname(dest.keys()[0])
  143.         self.dest=dest[self.seqname]
  144.     
  145.     def unset_dest(self):
  146.         #print 'unset_dest w/stacklength=',len(self.maneuver_stack),self.maneuver_stack
  147.         self.unset_seqname()
  148.         self.dest=None
  149.     
  150.     def set_center(self,center):
  151.         self.xc=center[0]
  152.         self.yc=center[1]
  153.     
  154.     def get_seqname(self):
  155.         return(self.seqname)
  156.     
  157.     def get_dest(self):
  158.         return(self.dest)    
  159.         
  160.     def get_timeout(self):
  161.         try:return(self.frame['timeout'])
  162.         except:return(0)
  163.     
  164.     def get_sound(self):
  165.         try:return(self.frame['snd'])
  166.         except:return(None)
  167.     
  168.     def begin_maneuver(self,maneuver):
  169.         #print ''
  170.         #print 'AnimatedChar:',len(maneuver),maneuver
  171.         if len(maneuver)>0:
  172.             self.set_dest(maneuver[0])
  173.         if len(maneuver)>1:
  174.             #print 'to here...'
  175.             for idx in range(len(maneuver)-1,0,-1):
  176.                 #print 'adding ',idx
  177.                 self.maneuver_stack.append(maneuver[idx])
  178.             
  179.